# web/forms.py（完整修正版）
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField
from wtforms.validators import DataRequired, ValidationError, Length, Regexp
import json

# JSON 验证器（已定义的保持不变）
def validate_json(form, field):
    if not field.data.strip():
        raise ValidationError("内容不能为空")
    try:
        json.loads(field.data)
    except json.JSONDecodeError as e:
        raise ValidationError(f"JSON格式错误：{str(e)}（行 {e.lineno}，列 {e.colno}）")

class ProblemCreateForm(FlaskForm):
    # 已有的字段（保持不变）
    title = StringField(
        '题目名称',
        validators=[DataRequired(message="标题为必填项"), Length(max=100)]
    )
    description = TextAreaField(
        '题目描述',
        validators=[DataRequired(message="描述为必填项"), Length(min=10)]
    )
    difficulty = StringField(
        '难度',
        validators=[DataRequired(message="难度为必填项")]
    )
    output_type = StringField(
        '输出类型',
        validators=[DataRequired(message="输出类型为必填项")],
        default='ordered'
    )
    initial_codes = TextAreaField(
        '初始代码（JSON）',
        validators=[DataRequired(message="初始代码为必填项"), validate_json]
    )
    function_signature = TextAreaField(
        '函数签名（JSON）',
        validators=[DataRequired(message="函数签名为必填项"), validate_json]
    )
    
    # 新增以下两个字段（关键修复）
    template_file = StringField(
        '英文标识',
        validators=[
            DataRequired(message="英文标识为必填项"),
            # 仅允许英文、数字、下划线和点（.）
            Regexp(r'^[a-zA-Z0-9_.]+$', message="仅支持英文、数字、下划线和点（.）")
        ]
    )
    testcases_dir = StringField(
        '测试用例目录',
        validators=[
            DataRequired(message="测试用例目录为必填项"),
            # 仅允许英文、数字、下划线和斜杠（/）
            Regexp(r'^[a-zA-Z0-9_/]+$', message="仅支持英文、数字、下划线和斜杠（/）")
        ]
    )